前言
在R语言中,与正态分布(或者说其它分布)有关的函数有四个,分别为dnorm,pnorm,qnorm和rnorm,其中,dnorm表示密度函数,pnorm表示分布函数,qnorm表示分位数函数,rnorm表示生成随机数的函数。在R中与之类似的函数还有很多,具体的可以通过help(Distributions)
命令去查看,对于分位数或百分位数的一些介绍可以看这篇笔记《分位数及其应用》,关于正态分布的知识可以看这篇笔记《正态分布笔记》。
现在这篇笔记就介绍一下这些函数的区别。
R中的随机数背景
R提供了多种随机数生成器(random number generators, RNG),默认采用的是Mersenne twister方法产生的随机数,该方法是由Makoto Matsumoto和Takuji Nishimura于1997年提出来的,其循环周期是$2^{19937}-1$。R里面还提供了了Wichmann-Hill、Marsaglia-Multicarry、Super-Duper、Knuth-TAOCP-2002、Knuth-TAOCP和L’Ecuyer-CMRG等几种随机数生成方法,可以通过RNGkind()
函数进行更改,例如,如果要改为WIchmann-Hill方法,就使用如下语句:
|
|
set.seed()
随机数种子
在R中使用随机数函数,例如rnorm()
函数来生成的随机数是不一样的,有时我们在做模拟时,为了比较不同的方法,就需要生成的随机数都一样,即重复生成相同的随机数,此时就可以使用set.seed()
来设置随机数种子,其参数为整数,如下所示:
|
|
dnorm
dnorm
中的d
表示density
,norm
表示正态贫,这个函数是正态分布的概率密度(probability density)函数
。
正态分布的公式如下所示:
给定x,μ和σ后,dnorm()
这个函数返回的就是会返回上面的这个公式的值,这个值就是Z-score,如果是标准正态分布,那么上述的公式就变成了这个样子,如下所示:
现在看一个案例,如下所示:
|
|
dnorm(0,mean=0,sd=1)
由于是标准正态分布函数的概率密度,这个命令其实可以直接写为dnorm(0)
即可,如下所示:
|
|
再看一个非标准正态分布的案例,如下所示:
|
|
虽然在dnorm()
中,x是一个概率密度函数(PDF,Probability Density Function)的独立变量,但它也能看作是一组经过Z转换后的一组变量,现在我们看一下使用dnorm
来绘制一个正态分布的概率密度函数曲线,如下所示:
|
|
现在使用dnorm()
函数计算一下Z_scores的概率密度,如下所示:
|
|
现在绘图,如下所示:
|
|
从上面的结果可以看出,在每个Z-score处,dnorm
可以绘制出这个Z-score对应的正态分布的pdf的高度。
pnorm
pnorm
函数中的p
表示Probability,它的功能是,在正态分布的PDF曲线上,返回从负无穷到q
的积分,其中这个q
指的是一个Z-score。现在我们大概就可以猜测出pnorm(0)
的值是0.5,因为在标准正态分布曲线上,当Z-score等于0时,这个点正好在标准正态分布曲线的正中间,那么从负无穷到0之间的曲线面积就是整个标准正态分布曲线下面积的一半,如下所示:
|
|
pnorm
函数还能使用lower.tail
参数,如果lower.tail
设置为FALSE
,那么pnorm()
函数返回的积分就是从q
到正无穷区间的PDF下的曲线面积,因此我们就知道了,pnorm(q)
与1-pnorm(q,lower.tail=FALSE)
的结果是一样的,如下所示:
|
|
在计算机出现之前的时代里,统计学家们使用正态分布进行统计时,通常是要查正态分布表的,但是,在计算机时代,通常都不使用正态分布表了,在R中,pnorm()
这个函数完全可以取代正态分布表了,现在我们使用一个Z-scores的向量来计算一下相应的累积概率,如下所示:
|
|
以上就是标准正态分布的累积分布函数(CDF,Cumulative Distribution Function)
曲线。
qnorm
简单来说,qnorm
是正态分布累积分布函数(CDF,Cumulative Distribution Function)
的反函数,也就是说它可以视为pnorm
的反函数,这里的q
指的是quantile,即分位数。
使用qnorm
这个函数可以回答这个问题:正态分布中的第p个分位数的Z-score是多少?
现在我们来计算一下,在正态分布分布中,第50百分位数的Z-score是多少,如下所示:
|
|
再来看一个案例:在正态分布中,第96个百分位的Z-score是多少,如下所示:
|
|
再来看一个案例:在正态分布中,第99个百分位的Z-score是多少,如下所示:
|
|
再来看一下pnorm()
这个函数,如下所示:
|
|
从上面我们可以看到,pnorm
这个函数的功能是,我们知道某个Z-score是多少,它位于哪个分位数上。
接着我们进一步举例来说明一下qnorm
和pnorm
的具体功能,如下所示:
|
|
现在进行绘图,如下所示:
|
|
rnorm
rnomr()
函数的功能用于生成一组符合正态分布的随机数,在学习各种统计学方法时,rnorm
这个函数应该是最常用的,它的参数有n
,mean
,sd
,其中n表示生成的随机数,mean与sd分别表示正态分布的均值与标准差,现在举个例子,如下所示:
|
|
现在我们绘制一下上面的几个向量的直方图,看一下它们的均值是否在70附近,如下所示:
|
|
在R语言中,生成不同分布的各种类型的函数都是以d,p,q,r开头的,使用原理跟上面的正态分布都一样。
runif-生成均匀分布的随机数
|
|
R语言中的随机数
sample()
函数是一个用于生成随机数的重要的核心函数,如果仅传递一个数值n给它,就会返回一个从1到n的自然数的排列,如果传递是n:m
就是生成从n到m的随机数,如是是7,5
,则会生成5个小于7的随机数,如下所示:
|
|
从上面的结果可以看出来,这些数字都是不同的,也就是说,sample函数默认情况下是不重复抽样,每个值只出现一次,如果允许有重复抽样,需要添加参数replace = TRUE
,如下所示:
|
|
sample函数通常会从某些向量中随机挑一些参数,如下所示:
|
|
也可以挑日期,如下所示:
|
|
R语言中其它分布的随机数
分布 | 中文名称 | R中的表达式 | 参数 |
---|---|---|---|
Beta | 贝塔分布 | beta(a,b) |
shape1、shape2 |
Binomial | 二项分布 | binom(n,p) |
size、prob |
Cauchy | 柯西分布 | cauchy() |
location、scale |
Chi-square | 卡方分布 | chisq(df) |
df |
Exponential | 指数分布 | exp(lambda) |
rate |
F | F分布 | f(df1,df2) |
df1、df2 |
Gamma | 伽玛分布 | gamma() |
shape、rate |
Geometric | 几何分布 | geom() |
prob |
Hypergeometric | 超几何分布 | hyper() |
m、n、k |
Logistic | 逻辑分布 | logis() |
location、scale |
Negative binomial | 负二项分布 | nbinom() |
size、prob |
Normal | 正态分布 | norm() |
mean、sd |
Multivariate normal | 多元正态分布 | mvnorm() |
mean、cov |
Poisson | 泊松分布 | pois() |
lambda |
T | t分布 | t() |
df |
Uniform | 均匀分布 | unif() |
min、max |
Weibull | 威布尔分布 | weibull() |
shape、scale |
Wilcoxon | 威尔考可森分布 | wilcox() |
m、n |
上述分布函数前面加上r,p、q、d就可以表示相应的目的:
r
:生成相应分布的随机数;d
:生成相应分布的密度函数;p
:生成相应分布的累积概率密度函数;q
:生成相应分布的分位数函数。
参考资料
- Introduction to dnorm, pnorm, qnorm, and rnorm for new biostatisticians
- R数据分析——方法与案例详解.电子工业出版社出版.方匡南 朱建平 姜叶飞.2015